<?php

/**
 * Product form.
 *
 * @package    sf_sandbox
 * @subpackage form
 * @author     Your name here
 * @version    SVN: $Id: sfDoctrineFormTemplate.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class ProductForm extends BaseProductForm {

    public function configure() {
        $this->disableLocalCSRFProtection();

        # Үйлдвэрлэгчид
        $manufacturers = array('' => '[Сонгох]') + ManufacturerTable::getForSelect();

        # Ангилал
        $categories = array('' => '[Сонгох]') + CategoryTable::getForSelect();

        # Төрөл
        $types = array('' => '[Сонгох]') + ProductTable::getTypeForSelect();

        $this->setWidgets(array(
            'id' => new sfWidgetFormInputHidden(),
            'manufacturer_id' => new sfWidgetFormChoice(array('choices' => $manufacturers)),
            'category_id' => new sfWidgetFormChoice(array('choices' => $categories)),
            'name' => new sfWidgetFormInputText(),
            'type' => new sfWidgetFormChoice(array('choices' => $types)),
            'intro_description' => new sfWidgetFormTextarea(),
            'description' => new sfWidgetFormTextarea(),
            'price' => new sfWidgetFormInputText(),
            'price_sale' => new sfWidgetFormInputText(),
            'sale_begin' => new sfWidgetFormInputText(array(), array('class' => 'input-append date datepicker', 'data-date-format' => 'yyyy-mm-dd', 'data-date-viewmode' => 'years', 'readonly' => 'true')),
            'sale_end' => new sfWidgetFormInputText(array(), array('class' => 'input-append date datepicker', 'data-date-format' => 'yyyy-mm-dd', 'data-date-viewmode' => 'years', 'readonly' => 'true')),
            'code' => new sfWidgetFormInputText(),
            'product_date' => new sfWidgetFormInputText(array(), array('class' => 'input-append date datepicker', 'data-date-format' => 'yyyy-mm-dd', 'data-date-viewmode' => 'years', 'readonly' => 'true')),
            'photos' => new sfWidgetFormInputHidden(),
        ));

        $validators = array();
        $validators['manufacturer_id'] = new sfValidatorChoice(array('choices' => array_keys($manufacturers)), array('required' => 'Та жагсаалтанд байгаа үйлдвэрлэгчдээс сонгоно уу', 'invalid' => 'Та жагсаалтанд байгаа үйлдвэрлэгчдээс сонгоно уу'));
        $validators['category_id'] = new sfValidatorChoice(array('choices' => array_keys($categories)), array('required' => 'Та жагсаалтанд байгаа ангиллуудаас сонгоно уу', 'invalid' => 'Та жагсаалтанд байгаа ангиллуудаас сонгоно уу'));
        $validators['name'] = new sfValidatorString(array('required' => true, 'max_length' => 100, 'min_length' => 2), array('required' => 'Та барааны нэрийг оруулна уу', 'max_length' => 'Барааны нэр %max_length% тэмдэгтээс ихгүй байх ёстой', 'min_length' => 'Барааны нэр %min_length% тэмдэгтээс багагүй байх ёстой'));
        $validators['type'] = new sfValidatorChoice(array('choices' => array_keys($types)), array('required' => 'Та жагсаалтанд байгаа төрлүүдээс сонгоно уу', 'invalid' => 'Та жагсаалтанд байгаа төрлүүдээс сонгоно уу'));
        $validators['intro_description'] = new sfValidatorPass();
        $validators['description'] = new sfValidatorPass();
        $validators['price'] = new sfValidatorNumber(array('required' => false), array('invalid' => 'Барааны үнийг зөв оруулна уу'));
        $validators['price_sale'] = new sfValidatorNumber(array('required' => false), array('invalid' => 'Барааны хямдарсан үнийг зөв оруулна уу'));
        $validators['sale_begin'] = new sfValidatorDate(array('required' => false), array('invalid' => 'Хямдрал эхлэх огноог зөв оруулна уу'));
        $validators['sale_end'] = new sfValidatorDate(array('required' => false), array('invalid' => 'Хямдрал дуусах огноог зөв оруулна уу'));
        $validators['code'] = new sfValidatorString(array('required' => true, 'max_length' => 20), array('required' => 'Та барааны кодыг оруулна уу', 'max_length' => 'Барааны код %max_length% тэмдэгтээс ихгүй байх ёстой'));
        $validators['product_date'] = new sfValidatorDate(array('required' => true), array('required' => 'Та үйлдвэрлэгдсэн огноо оруулна уу'));
        $validators['photos'] = new sfValidatorPass();

        $this->setValidators($validators);

        $this->getWidgetSchema()->setNameFormat('product[%s]');

        # Label
        $this->getWidget('manufacturer_id')->setLabel('* Үйлдвэрлэгч:');
        $this->getWidget('category_id')->setLabel('* Ангилал:');
        $this->getWidget('name')->setLabel('* Нэр:');
        $this->getWidget('type')->setLabel('* Төрөл:');
        $this->getWidget('intro_description')->setLabel('Товч тайлбар:');
        $this->getWidget('description')->setLabel('Дэлгэрэнгүй тайлбар:');
        $this->getWidget('price')->setLabel('Үнэ:');
        $this->getWidget('price_sale')->setLabel('Үнэ /Хямдарсан/:');
        $this->getWidget('sale_begin')->setLabel('Хямдрал эхлэх огноо:');
        $this->getWidget('sale_end')->setLabel('Хямдрал дуусах огноо:');
        $this->getWidget('code')->setLabel('* Код:');
        $this->getWidget('product_date')->setLabel('* Үйлдвэрлэгдсэн огноо:');

        # Default
        $this->getWidget('product_date')->setDefault(date('Y-m-d'));

        # validation

        $this->validatorSchema->setPreValidator(
                new sfValidatorCallback(array('callback' => array($this, 'validateProduct')))
        );
        $this->validatorSchema->setOption('allow_extra_fields', true);
        $this->validatorSchema->setOption('filter_extra_fields', false);
    }

    public function validateProduct($validator, $values) {
        $category_id = (int) $values['category_id'];
        $name = AppTools::toString($values['name']);

        $row = Doctrine_Query::create()
                ->select('id, name')
                ->from('Product')
                ->where('name = ?', $name)
                ->andWhere('category_id = ?', $category_id)
                ->fetchOne();

        if ($row) {
            if ($row['id'] != $this->object->id) {
                $error = new sfValidatorError($validator, 'Энэ бараа өмнө нь үүссэн байна');
                throw new sfValidatorErrorSchema($validator, array('name' => $error));
            }
        }

        return $values;
    }

}
